要想在自己的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
- 6、清空缓存,最后再说一个坑,如果经过一系列的配置,发现完全都配置好了,可是微信支付依然返回-1。而此时我们可能又会回头排查各个节点的问题,是配置问题?是自己的数据传递问题?到底哪里的bug?
其实这时候,清空下自己的应用缓存就可以了,通过 设置-应用管理-your app-清空缓存,进行缓存清理过后,立竿见影拿到成功的回调!