android微信支付详解与坑

要想在自己的APP中实现APP支付必须申请开通支付功能,这些按着文档来吧,我还是直接说Android中的问题吧。

一、签名

一定要在开放平台为自己的APP配置正确的包名和签名(签名:将APP打一个正式环境的包,然后在微信开放平台下载签名工具进行签名)。

二、打包测试

和微信的第三方登录一样,必须要打正式包,不是debug的,来进行测试,这样就没有办法调试了,感觉很不爽。所以提供一个办法来拯救一下嘿嘿:
在build.gradle文件中设置debug环境和relealse环境的签名相同就可以解决这个文通了,已经试过了,可以的。

 signingConfigs {

        release {
            //.jks文件放在项目目录
            storeFile file("xxx.jks")
            storePassword "xxx"
            keyAlias "xxx.release"
            keyPassword "xxx"
        }
        debug {
            //.jks文件放在项目目录
            storeFile file("xxx.jks")
            storePassword "xxx"
            keyAlias "xxx.release"
            keyPassword "xxx"
        }
    }

接下来按着官网的文档和demo来完成:

1、定义一个全局的变量:

private IWXAPI api;

2、注册APPID

api = WXAPIFactory.createWXAPI(this, "你在微信开放平台创建的app的APPID");

官网是这样注册的,但是,下面要用到msgAPi,所以定义为全局的。

final IWXAPI msgApi = WXAPIFactory.createWXAPI(SelectPaymentMethodActivity.this, null);
msgApi.registerApp("你在微信开放平台创建的app的APPID");


3、开始支付

当你点击支付的时候去调用服务端的接口(服务端调用统一下单接口,反geini一些信息),所以这里你不能自己独立完成需要后端的支持。

//我将后端反给我的信息放到了WeiXinPay中,这步是获取数据

WeiXinPay weiXinPay = (WeiXinPay) map.get("weixinpay");

//这个在官网里就会看到,将你获取的信息赋给payReq,这块就是调起微信的关键

PayReq payReq = new PayReq();
payReq.appId = weiXinPay.getAppid();
payReq.partnerId = weiXinPay.getPartnerid();
payReq.prepayId = weiXinPay.getPrepayid();
payReq.packageValue = weiXinPay.getPackage_exten();
payReq.nonceStr = weiXinPay.getNoncestr();
payReq.timeStamp = weiXinPay.getTimestamp();
payReq.sign = weiXinPay.getSign();
api.sendReq(payReq);

4、接下来就是在微信里的一些东西了,我们不用管,我们只需要关心回调页WXPayEntryActivity,这里需要注意该文件必须在wxapi这个文件夹下,及com.xxx.xxx.wxapi.WXPayEntryActivity

//必须实现接口,重写方法
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {

    private IWXAPI api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wxpayentry);
        api = WXAPIFactory.createWXAPI(this, "wx72e0123dd9b54a73");
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp baseResp) {
        Log.e("---------->","code:"+baseResp.errCode);

        if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            //这里就是支付完成后需要做的事,如跳到哪个页面啥的
        }
    }
}

5、还有一点在功能清单中对Activity中进行注册

 <!--微信支付-->
 <activity android:name=".wxapi.WXPayEntryActivity"
           android:exported="true"
           android:launchMode="singleTop"/>




-1 扫坑(可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等)


微信

商户系统和微信支付系统主要交互说明:

  • 步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
  • 步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。
  • 步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式为Sign=WXPay
  • 步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明
  • 步骤5:商户后台接收支付通知。api参见【支付结果通知API
  • 步骤6:商户后台查询支付结果。,api参见【查询订单API

调起支付接口

请求参数

字段名 变量名 类型 必填 示例值 描述
应用ID appid String(32) wx8888888888888888 微信开放平台审核通过的应用APPID
商户号 partnerid String(32) 1900000109 微信支付分配的商户号
预支付交易会话ID prepayid String(32) WX1217752501201407033233368018 微信返回的支付交易会话ID
扩展字段 package String(128) Sign=WXPay 暂填写固定值Sign=WXPay
随机字符串 noncestr String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串,不长于32位。推荐随机数生成算法
时间戳 timestamp String(10) 1412000000 时间戳,请见接口规则-参数规定
签名 sign String(32) C380BEC2BFD727A4B6845133519F3AD6 签名,详见签名生成算法注意:签名方式一定要与统一下单接口使用的一致

举例请见:APP端开发说明

返回结果

名称 描述 解决方案
0 成功 展示成功页面
-1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。

几大坑原因+解决:

  • 1、 微信开放平台上传的签名问题(调试环境使用的签名要和微信后台保持一致)
  • 2、 Manifest文件中WXPayEntryActivity 的配置问题。一定要声明
  • 3、 WXPayEntryActivity 类必须放在 包名.wxapi 下
  • 4、 签名工作一般由后台完成,在生成签名时,务必注意key的拼写问题,比如必须拼appid而不是appId,必须拼prepayid而不是prepayId,这里跟上面PayReq 对象中字段的命名方式不一样,用错了也是照样返回-1。一定要小写!!!参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式为Sign=WXPay
  • 5、签名所使用的是 微信商户平台API密钥,而不是微信开放平台AppSecret。 API密钥在商户平台后台-->API安全-->先安装操作证书,后设置密钥
  • 6、清空缓存,最后再说一个坑,如果经过一系列的配置,发现完全都配置好了,可是微信支付依然返回-1。而此时我们可能又会回头排查各个节点的问题,是配置问题?是自己的数据传递问题?到底哪里的bug?
    其实这时候,清空下自己的应用缓存就可以了,通过 设置-应用管理-your app-清空缓存,进行缓存清理过后,立竿见影拿到成功的回调!

参考文档:

微信支付申请流程
微信支付签名的配置
微信支付步骤
微信支付与坑
微信支付失败-1彻底扫坑

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348

推荐阅读更多精彩内容