Android实现微信支付和踩过的深坑
1.APP用户请求web url,这个url会去“微信商户平台”统一下订单。
2.下单以后返回一些数据,根据返回的数据,再去"微信APP"启动支付。
这其中涉及了3个sign(也叫签名的东西)。如果不知道签名的规则请:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3 查看
第一个sign: 用户去“微信商户平台下单” 参数封装成一个xml,其中sign参数为:MD5(所有参数排序后+ key=微信商户平台的**)。
第二个sign: “微信商户平台”下单后,返回的sign,用于自己平台上对于微信返回的数据做校验。千万不要拿这个sign去启动“微信APP”支付(要不然就出提示:errCode = -1 的错误)。
第三个sign:需要把下单成功后的参数,按照特定的规则排列,这个规则就是,看下图:
参数名和参数值都不能错,必须是这样的 。然后根据 appid,partnerid,prepayid,package,noncestr,timestamp进行签名(sign)签名的规则为:MD5(这6个参数排序后+ key=微信商户平台的**)。加入sign参数后,再去加入其他参数。然后你的安卓APP根据获取到的参数来启动微信支付。(否则也会出现 errCode = -1 的错误)。
errCode -1:签名错误,所说的签名就是第三个sign。当然还有APPID未通过,和APPID注册的和返回的不一样,这个是“微信开放平台”里的东西。
所以说,如果看到3个sign都是不一样的前往不要吃惊。
APP代码比较简单如下:
- public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- api = WXAPIFactory.createWXAPI(this, appid,false);
- api.registerApp(appid);//注册appid
- api.handleIntent(getIntent(), this);
- Pay();
- }
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- setIntent(intent);
- api.handleIntent(intent, this);
- }
- private void Pay(){
- new Request().get(url, new Callback() {//发起web请求
- @Override
- public void finished(final String result) {
- if (null != result) {
- final Map map = gson.fromJson(result, Map.class);
- if ("SUCCESS".equalsIgnoreCase((String) map.get("return_code"))) {
- api.registerApp((String) map.get("appid"));
- PayReq req = new PayReq();
- req.appId = (String) map.get("appid");
- req.partnerId = (String) map.get("partnerid");
- req.prepayId = (String) map.get("prepayid");
- req.packageValue = (String) map.get("package");
- req.nonceStr = (String) map.get("noncestr");
- req.timeStamp = (String) map.get("timestamp");
- req.sign = (String) map.get("sign");
- api.sendReq(req);
- } else {
- Log.e("error-->", "FAIL");
- }
- } else {
- Log.e("error-->", "REQUEST FAIL");
- }
- }
- });
- }
- @Override
- public void onReq(BaseReq baseReq) { }
- @Override
- public void onResp(BaseResp baseResp) {
- if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
- //支付成功
- }else{
- //支付失败
- }
- }
- }
如果出现微信支付成功但是未回调,onResp方法,请检查包名是否正确,微信支付和微信分享的回调必须如下图:
这种目录结构才行。同时还要修改AndroidManifest.xml文件如下图:
请注意: android:exported="true"。还要注意代码里要有这2句如下图:
其他的应该都有返回错误的提示信息,都好解决。
鸣谢:https://blog.****.net/qilin001cs/article/details/75909756博主
1.APP用户请求web url,这个url会去“微信商户平台”统一下订单。
2.下单以后返回一些数据,根据返回的数据,再去"微信APP"启动支付。
这其中涉及了3个sign(也叫签名的东西)。如果不知道签名的规则请:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3 查看
第一个sign: 用户去“微信商户平台下单” 参数封装成一个xml,其中sign参数为:MD5(所有参数排序后+ key=微信商户平台的**)。
第二个sign: “微信商户平台”下单后,返回的sign,用于自己平台上对于微信返回的数据做校验。千万不要拿这个sign去启动“微信APP”支付(要不然就出提示:errCode = -1 的错误)。
第三个sign:需要把下单成功后的参数,按照特定的规则排列,这个规则就是,看下图:
参数名和参数值都不能错,必须是这样的 。然后根据 appid,partnerid,prepayid,package,noncestr,timestamp进行签名(sign)签名的规则为:MD5(这6个参数排序后+ key=微信商户平台的**)。加入sign参数后,再去加入其他参数。然后你的安卓APP根据获取到的参数来启动微信支付。(否则也会出现 errCode = -1 的错误)。
errCode -1:签名错误,所说的签名就是第三个sign。当然还有APPID未通过,和APPID注册的和返回的不一样,这个是“微信开放平台”里的东西。
所以说,如果看到3个sign都是不一样的前往不要吃惊。
APP代码比较简单如下:
- public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- api = WXAPIFactory.createWXAPI(this, appid,false);
- api.registerApp(appid);//注册appid
- api.handleIntent(getIntent(), this);
- Pay();
- }
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- setIntent(intent);
- api.handleIntent(intent, this);
- }
- private void Pay(){
- new Request().get(url, new Callback() {//发起web请求
- @Override
- public void finished(final String result) {
- if (null != result) {
- final Map map = gson.fromJson(result, Map.class);
- if ("SUCCESS".equalsIgnoreCase((String) map.get("return_code"))) {
- api.registerApp((String) map.get("appid"));
- PayReq req = new PayReq();
- req.appId = (String) map.get("appid");
- req.partnerId = (String) map.get("partnerid");
- req.prepayId = (String) map.get("prepayid");
- req.packageValue = (String) map.get("package");
- req.nonceStr = (String) map.get("noncestr");
- req.timeStamp = (String) map.get("timestamp");
- req.sign = (String) map.get("sign");
- api.sendReq(req);
- } else {
- Log.e("error-->", "FAIL");
- }
- } else {
- Log.e("error-->", "REQUEST FAIL");
- }
- }
- });
- }
- @Override
- public void onReq(BaseReq baseReq) { }
- @Override
- public void onResp(BaseResp baseResp) {
- if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
- //支付成功
- }else{
- //支付失败
- }
- }
- }
如果出现微信支付成功但是未回调,onResp方法,请检查包名是否正确,微信支付和微信分享的回调必须如下图:
这种目录结构才行。同时还要修改AndroidManifest.xml文件如下图:
请注意: android:exported="true"。还要注意代码里要有这2句如下图:
其他的应该都有返回错误的提示信息,都好解决。
鸣谢:https://blog.****.net/qilin001cs/article/details/75909756博主