微信支付
2016-06-16 14:33
676 查看
首先要了解微信支付的交互时序图,统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成
开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单、第二步生成微信支付参数、第三步调起微信APP支付
统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
微信支付必备参数:
在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity
注册APPID
调起支付
支付结果回调
public class PayActivity extends Activity {
TextView show;
public static Handler handler = new Handler(new Callback() {
// msg.what== 0 :表示支付成功
// msg.what== -1 :表示支付失败
// msg.what== -2 :表示取消支付
@Override
public boolean handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case 800://商户订单号重复或生成错误
break;
case 0://支付成功
break;
case -1://支付失败
break;
case -2://取消支付
break;
default:
break;
}
return false;
}
});
}
以下为需要用到的工具类
nonceStr随机数
生成APP签名
开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单、第二步生成微信支付参数、第三步调起微信APP支付
统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
微信支付必备参数:
// appid // 请同时修改 androidmanifest.xml里面,.PayActivityd里的属性<data // android:scheme="wxb4ba3c02aa476ea1"/>为新设置的appid public static final String APP_ID = "xxxxxxxxxxxxxxxxxxxxxxx"; // 商户号 public static final String MCH_ID = "xxxxx"; // API密钥,在商户平台设置 public static final String API_KEY = "xxxxxxxxxxxxxxxxxxxxxxx";在微信开放平台中查看审核通过的APP应用,是否申请支付功能,若已申请,登录微信支付|商户平台:http://pay.weixin.qq.com 查看对应的商户号、API密钥
在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { private IWXAPI api; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pay_result); api = WXAPIFactory.createWXAPI(this, Constants.APP_ID); api.handleIntent(getIntent(), this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); } @Override public void onReq(BaseReq req) { } @Override public void onResp(BaseResp resp) { Log.d(TAG, "onPayFinish, errCode = " + resp.errCode); if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { Toast.makeText(WXPayEntryActivity.this, resp.errStr, Toast.LENGTH_SHORT).show(); //通知业务类支付结果 PayActivity.handler.sendEmptyMessage(resp.errCode); finish(); } } }在AndroidManifest.xml文件中添加如下配置
<activity android:name=".PayActivity" android:exported="true" android:label="@string/app_name" android:launchMode="singleTop" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="替换APP_ID" /> </intent-filter> </activity> <activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop" />
注册APPID
IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null); msgApi.registerApp(Constants.APP_ID);
调起支付
IWXAPI api; PayReq request = new PayReq(); request.appId = "wxd930ea5d5a258f4f"; request.partnerId = "1900000109"; request.prepayId= "1101000000140415649af9fc314aa427",; request.packageValue = "Sign=WXPay"; request.nonceStr= "1101000000140429eb40476f8896f4c9"; request.timeStamp= "1398746574"; request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B"; api.sendReq(req);
支付结果回调
public class PayActivity extends Activity {
TextView show;
public static Handler handler = new Handler(new Callback() {
// msg.what== 0 :表示支付成功
// msg.what== -1 :表示支付失败
// msg.what== -2 :表示取消支付
@Override
public boolean handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case 800://商户订单号重复或生成错误
break;
case 0://支付成功
break;
case -1://支付失败
break;
case -2://取消支付
break;
default:
break;
}
return false;
}
});
}
以下为需要用到的工具类
nonceStr随机数
private String genNonceStr() { Random random = new Random(); return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)) .getBytes()); }timeStamp时间戳
private long genTimeStamp() { return System.currentTimeMillis() / 1000; }
生成APP签名
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()) .toUpperCase(); Log.e("orion", appSign); return appSign; }加密算法
public class MD5 { private MD5() {} public final static String getMessageDigest(byte[] buffer) { char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; try { MessageDigest mdTemp = MessageDigest.getInstance("MD5"); mdTemp.update(buffer); byte[] md = mdTemp.digest(); int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { return null; } } }
相关文章推荐
- 社交巨头三国杀:微信、WhatsApp、Line到底有啥区别?
- 微信悄悄升级群聊功能:个人微信营销号的福音
- 个人信息安全报告发布:有 APP 每分钟调用位置权限 1468 次
- 突击部队拼多多
- 我是运营,我没有假期
- 如何做到日消息量100万的微信公众号?
- 论微信取消推送功能的可能性(原创)
- 下载量超过一亿的流行应用被发现含有恶意模块
- 微信的成功,靠的是QQ导流吗?
- 「Linux 中国」2018 微信文章排行榜
- 马化腾亲自“站台” 企业微信和个人微信互通能带来什么?
- 苹果与Siri的七年之痒:“宫斗”戏码不断上演
- TIMESTAMP和DATETIME哪个好
- 一个微信群的兴亡
- Ruby on Rails在Ping ++ 平台实现支付
- 微信服务号推送模板消息接口