Android第三方微信支付教程
作者:lijiao 发布时间:2022-03-13 23:38:40
标签:Android,第三方支付,微信支付
做了微信支付,下载了Demo,发现和之前有所改动,v3.0的版本,也许有的朋友还在摸索,这里我已经成功支付,话不多说,直接进入主题:
一、首先要在微信开发平台注册账号,新增应用,填写正确的包名,正确的签名(MD5中的一串字符冒号去掉,全部小写),当然也会生成的AppID和AppSecret都有用!最后还要花300大洋开通支付功能!
二、分析一下微信支付的流程
三、界面交互流程
上面都看明白了,接下来就是写代码了
四、这里必须要有wxapi这个包名,同时必须有WXPayEntryActivity这个类名
五、在AndroidManifest.xml里面配置相关信息
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 启动主页面 -->
<activity
android:name=".ui.activity.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="wx487898a262d23df3" />
</intent-filter>
</activity>
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:label="@string/title_activity_wxpayentry"
android:launchMode="singleTop" />
<receiver
android:name=".wxpay.AppRegister"
android:permission="com.tencent.mm.plugin.permission.SEND" >
<intent-filter>
<action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" />
</intent-filter>
</receiver>
/**
* 首先调用接口,要把一些基本信息作为参数传给服务器
* 比如:金额fee,用户id,标题title等
* 调用成功之后会返回微信所需要的参数,如:
* appid,noncestr,package,partnerid,prepayid,
* timestamp,sign
* 微信支付
*/
StringBuffer sb = new StringBuffer();
WeixinPay wpay;
private AlertDialog mDialog;
private AlertDialog.Builder builder;
public void weixinPay() {
// 通过WXAPIFactory工厂,获取IWXAPI的实例
api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
// 将该app注册到微信
api.registerApp(Constants.APP_ID);
// 调用接口
Params p = new Params();
p.put("fee",fee);
p.put("spbill_create_ip", NetWorkUtils.getLocalIpAddress(this));
String value = "商品标题 " + title;
try {
String title = new String(value.getBytes("UTF-8"));
p.put("body", title);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
p.put("userId", O.getUser().getId());
p.post(C.URL.WEIXIN_PAY, new ReHandler() {
@Override
public void onSuccess(NetEntity entity) {
wpay = entity.toObj(WeixinPay.class);
PayReq req = new PayReq();
req.appId = wpay.getAppid();// 微信appId
req.packageValue = wpay.getPackageValue();// 包
req.extData = "app data"; // optional
req.timeStamp = wpay.getTimeStamp();// 时间戳
req.partnerId = wpay.getPartnerId();// 商户号"
req.prepayId = wpay.getPrepayId();// 预支付订单号
req.nonceStr = wpay.getNonceStr();// 随机字符串
req.sign = wpay.getSign();// 后台返回的签名
// 本地再次签名
List<NameValuePair> signParams = new LinkedList<NameValuePair>();
signParams.add(new BasicNameValuePair("appid", req.appId));
signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
signParams.add(new BasicNameValuePair("package",req.packageValue));
signParams.add(new BasicNameValuePair("partnerid",req.partnerId));
signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
signParams.add(new BasicNameValuePair("timestamp",req.timeStamp));
req.sign = genAppSign(signParams);
// 调微信支付
if(api.isWXAppInstalled()&&api.isWXAppSupportAPI()){
api.sendReq(req);
}else{
builder = new AlertDialog.Builder(WXPayEntryActivity.this);
builder.setNeutralButton("关闭",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mDialog.dismiss();
}
}).setTitle("友情提醒").setMessage("请安装微信客户端");
mDialog = builder.create();
mDialog.show();
}
}
@Override
public void onStart() {
}
@Override
public void onFailure(String message) {
}
});
}
private String genAppSign(List<NameValuePair> params) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < params.size(); i++) {
sb.append(params.get(i).getName());
sb.append('=');
sb.append(params.get(i).getValue());
sb.append('&');
}
sb.append("key=");
sb.append(Constants.API_KEY);
this.sb.append("sign str\n" + sb.toString() + "\n\n");
String appSign = MD5.getMessageDigest(sb.toString().getBytes());
Log.e("orion", appSign);
return appSign;
}
六、在WXPayEntryActivity类里面成功之后回调方法onResp()
@Override
public void onResp(BaseResp resp) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if(resp.errCode==-2){
Toast.makeText(this,"取消付款!", Toast.LENGTH_LONG).show();
}
if(resp.errCode==-1){
Toast.makeText(this,"支付错误!", Toast.LENGTH_LONG).show();
}
if(resp.errCode==0){
queryOrder();//查询接口调用后台服务器查询是否成功
}
}
最后做完之后,一定要签名打包,这个是微信的独家秘笈,你忘了就会跳出-1,呵呵。
最后总结一下支付返回-1的情况
1.检查微信后台的签名,包名是否正确
2.工程是否签名打包
3.如果之前做过测试显示过-1的情况,必须清除微信的清除数据,重新登录微信
4.后台服务器是否按照要求第一次签名,第二次签名,如果第二次签名不对,那我们就自己再次签名一次,我的代码里面写了


猜你喜欢
- 有些时候我们需要监听webview的滚动事件,但WebView没有直接监听滑动的方法,看WebView的源码则会发现有一个protected
- .NET 4 开始,在System.Collection.Concurrent中提供了几个线程安全的集合类。线程安全的集合可防止多个线程以相
- 一、javaweb中前端向后端传值的几种方式1.查询字符串的方式即在请求地址后拼接上请求参数,多个参数以&连接- 表单方式提交2.第
- 简介本文主要介绍如何使用java代码利用Selenium操作浏览器,某些网页元素加载慢,如何操作元素就会把找不到元素的异常,此时需要设置元素
- 导入Jstl标签库<%@ taglib uri="http://java.sun.com/jsp/jstl/core&quo
- 上篇《Spring Aop实例之xml配置》中,讲解了xml配置方式,今天来说说AspectJ注解方式去配置spring aop。依旧采用的
- 在5.2.1节和5.2.2节介绍了<a>标签以及TextView自动识别的特殊文本(网址、电话号、Email等),这些都可以通过
- Spring Aop的原理Spring的AOP就是通过 * 实现的。当为某个Bean或者某些Bean配置切面时,Spring会为其创建代理
- 话不多说,请看实例代码String ip = request.getHeader("x-forwarded-for");
- 1.异步委托开启线程public class Program { public static void
- 本文实例为大家分享了Android自定义view利用PathEffect实现动态效果的具体代码,供大家参考,具体内容如下前言在上一篇此类型的
- 1. 什么是λ表达式λ表达式本质上是一个匿名方法。让我们来看下面这个例子: public int add(int x, int
- 在学习MyBatis过程中想实现模糊查询,可惜失败了。后来上百度上查了一下,算是解决了。记录一下MyBatis实现模糊查询的几种方式。 数据
- java中的复杂查询sql语句实现:这样的查询栏,在页面中很常见,这就是复杂查询的条件,我们可以填写一个条件或多个条件,也可以一个都不填写,
- android提供的工具链和开发工具比较完善,因此它的开发环境的搭建比较简单,相信许多朋友都已经搭建好环境,并编写了HelloA
- 前言本文详细介绍如何使用spring-boot2.x快速整合log4j2日志框架。spring-boot2.x使用logback作为默认日志
- 前言convert 叫强制转换,可以是其他类型。最近在工作中遇到一个问题,需要将字符串形式的数值转换回数值,很正常的要求吧。却遇到了问题,下
- 本文实例分析了C#中float的取值范围和精度。分享给大家供大家参考。具体分析如下:float类型的表现形式:默认情况下,赋值运算符右侧的实
- 垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法(你可以 写程序验证这个结论),一般的纯Java编写的Class不需要重新
- 最近利用下班的时候看了看的think in java感觉再看 和第一次看大不一样接下来说一下java中对象和引用的关系,以及内部类的概念。1