因为文档比较粗糙,所以写篇博客记录一下踩坑过程,用的是eclipse接入的老项目
步骤:
- 后台签名和包名设置:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
注意:包名与AndroidManifest.xml里那个包名一致,签名按照文档里的步骤下载apk安装到装有你的app的手机里,打开该软件输入包名会生成一个字符串,复制出来设置后台 - 下载
.jar
文件, 按需选择接入库
– | – | – |
compile ‘com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+’ | 包含统计功能 | 点击下载 |
compile ‘com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+’ | 不包含统计 | — |
- 将下载好的jar文件放在项目jar文件目录,在AndroidManifest.xml中添加相关权限
<!--微信支付权限-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--声明WXPayEntryActivity-->
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="你的appid"/>
</intent-filter>
</activity>
- 在项目中创建wxapi目录,一般来说就是“包名.wxapi”,例如com.wxpay.game.wxapi;
把demo里相应目录下的文件复制到你这个目录下面,然后将报错修改好,引入库错误就是引入的地方将import com.tencent.mm.sdk
这里的改为com.tencent.mm.opensdk
- app安卓客户端只要接入调起支付,调起支付之前首先向己方服务器请求相关数据,发起预支付订单,当己方服务器发起预支付成功后返回的数据直接拿来用(这里的随机字符串是己方服务器发起预支付订单时微信服务器返回的随机字符串,这个签名也是己方服务器通过预支付时微信返回数据拼接而成的,客户端直接拿来用就ok):
注册微信支付:
// 商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 将该app注册到微信
msgApi.registerApp("项目APPid");
准备工作:向己方服务器请求其发起预支付后收到的数据:
// 类似这样的请求方式,具体参数与己方服务器进行匹配
// http://xxx.xxx.xxx.xxx/pay/android_weixin_request.php?out_trade_no=[VALUE]&total_fee=[VALUE]&spbill_create_ip=[VALUE]&time_start=[VALUE]
// WX_PAY_ORDER:http://xxx.xxx.xxx.xxx/pay/android_weixin_request.php?out_trade_no=
String url = String.format(WX_PAY_ORDER);
req.timeStamp = String.valueOf(genTimeStamp());
req.nonceStr = genNonceStr();
Log.d("req.timeStamp",req.timeStamp);
url += java.net.URLEncoder.encode(genOutTradNo());
url += "&total_fee=";
url += java.net.URLEncoder.encode(m_price*100 + "");
// url += "&spbill_create_ip=";
// url += java.net.URLEncoder.encode("xxx.xxx.xxx.xxx");
url += "&time_start=";
url += java.net.URLEncoder.encode(req.timeStamp + "");
url += "&nonce_str=";
url += java.net.URLEncoder.encode(req.nonceStr);
Log.d("url==",url);
try{
Log.d("向游戏后台发起请求",url);
HttpGet httpGet=new HttpGet(url);
HttpResponse resp=new DefaultHttpClient().execute(httpGet);
HttpEntity entity=resp.getEntity();
byte[] response = EntityUtils.toByteArray(entity);
showResponseResult(response);
}
catch(Exception e)
{
e.printStackTrace();
}
//获取时间戳
private static long genTimeStamp() {
return System.currentTimeMillis() / 1000;
}
//获取商品信息串
private static String genOutTradNo() {
int ad = Myd2Activity.GetAdCode();
String mAppOrderId = m_serverId + "-" + m_userId + "-" + ad + "-" + System.currentTimeMillis();
return mAppOrderId;
}
//获取随机字符串
private static String genNonceStr() {
Random random = new Random();
return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
}
调起支付:
protected void showResponseResult(byte[] response) throws UnsupportedEncodingException, IOException
{
Log.d("showResponseResult==",response.toString());
if (null == response.toString())
{
return;
}
try
{
String content = new String(response);
Log.d("get server pay params:",content);
JSONObject json = new JSONObject(content);
if(null != json && !json.has("retcode") ){
if (json.getString("status")=="fail")
{
//发起订单失败
Util.showResultDialog(m_instance, "服务器返回失败", "发起订单失败");
return;
}
req.appId = WX_APP_ID; //你的appId
Log.d("req.appId:",req.appId);
req.partnerId = WX_USER_ID;
Log.d("req.partnerId:",req.partnerId);
req.prepayId = json.getString("prepay_id");
Log.d("req.prepayId:",req.prepayId);
req.nonceStr = json.getString("noncestr");
Log.d("req.nonceStr:",req.nonceStr);
//req.timeStamp = json.getString("timestamp");
Log.d("req.timeStamp",req.timeStamp);
req.packageValue = "Sign=WXPay";
Log.d("req.packageValue",req.packageValue);
req.sign = json.getString("sign");
Log.d("req.sign",req.sign);
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
// 定义private static IWXAPI api;
api.sendReq(req);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
- 至于支付回调就参照demo里的回调,加上自己需求,在wxapi目录下文件WXPayEntryActivity里
发起支付返回-1:
原因大多都是因为参数不对,一定要记得与己方服务器返回的参数一致,后台配置的签名与包名与项目和代码中一致。
微信支付成功付款,己方服务器没有收到回调原因:
- 没有配置“支付授权目录”或者“支付授权目录”配置不对
配置位置:微信支付商户-> 产品中心-> 开发配置-> 支付授权目录 - 回调地址不对