小程序,公众号,App的微信支付详解
2018-06-07 本文已影响42人
honey缘木鱼
现在我们好多开发应用几乎80%都用到了支付接口,小程序,公众号,App在微信支付上有什么相似于不同呢?
一.APP支付(https://open.weixin.qq.com)
1.项目设置APPID
2.业务流程
流程
3.下载并运行demo
其实把demo看明白了,直接运用到自己的app里,也不是不可以的
4.设置项目
- 在Xcode中,projectName-->Info-->URL Types 添加appid。设置之后才能实现应用间跳转
2.导入sdk
2411791-a4695842aaa3155a.png如果使用了pod,直接在Podfile中添加pod 'WechatOpenSDK' 然后执行 pod update即可。如果没有使用pod,在添加了sdk文件包之后,需要在pojectName-->General-->Linked Frameworks and Libraries 中添加相应内容
添加框架
3.代码
在AppDelegate.m 中的didFinishLaunchingWithOptions方法添加
[WXApi registerApp:@"wx00000000"];//注册appid
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [WXApi handleOpenURL:url delegate:[PaymentManager sharedManager]];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [WXApi handleOpenURL:url delegate:[PaymentManager sharedManager]];
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
return [WXApi handleOpenURL:url delegate:[PaymentManager sharedManager]];
}
作为前端开发,那些麻烦的签名都属于服务器端的,顿时有没有感觉很简单,下面及 就看一下具体。下面的步奏就是 小程序,公众号,App微信支付通用的前端方法。
1.先向服务器端请求接口,拿到订单号
2.根据订单号,再向服务器端请求一次,拿到微信所需要的串,就是各种签名算法
3.调用的微信支付方法分别为:
App代码:
NSString *res = [WXApiRequestHandler jumpToBizPay:DESDecrypt];
DESDecrypt就是后台返回的签名字符串。
+ (NSString * )jumpToBizPay:(NSString *)string
{
if(string!=nil)
{
if([self booWeixin])
{
NSDictionary *dict = [IHUtility getWXString:string];
PayReq* req = [[PayReq alloc] init];
req.partnerId = [dict valueForKey:@"partnerid"];
req.prepayId =[dict valueForKey:@"prepayid"];
req.nonceStr = [dict valueForKey:@"noncestr"];
req.timeStamp = [[dict valueForKey:@"timestamp"] intValue];
req.package = [dict valueForKey:@"package"];
req.sign = [dict valueForKey:@"sign"];
[WXApi sendReq:req];
return @"";
}else
{
return @"请安装微信客户端";
}
}
return @"支付失败";
}
+(BOOL)booWeixin{
// 判断是否安装微信
if ([WXApi isWXAppInstalled] ){
return YES;
//判断当前微信的版本是否支持OpenApi
// if ([WXApi isWXAppSupportApi]) {
// return YES;
// }else{
// NSLog(@"请升级微信至最新版本!");
// return NO;
// }
}else{
NSLog(@"请安装微信客户端");
return NO;
}
}
公众号代码:
注:JS API的返回结果get_brand_wcpay_request:ok仅在用户成功完成支付时返回。由于前端交互复杂,get_brand_wcpay_request:cancel或者get_brand_wcpay_request:fail可以统一处理为用户遇到错误或者主动放弃,不必细化区分。
示例代码如下:
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":"wx2421b1c4370ec43b", //公众号名称,由商户传入
"timeStamp":"1395712654", //时间戳,自1970年以来的秒数
"nonceStr":"e61463f8efa94090b1f366cccfbbb444", //随机串
"package":"prepay_id=u802345jgfjsdfgsdg888",
"signType":"MD5", //微信签名方式:
"paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。
}
);
}
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}else{
onBridgeReady();
}
小程序代码:
wx.requestPayment(
{
'timeStamp': '',
'nonceStr': '',
'package': '',
'signType': 'MD5',
'paySign': '',
'success':function(res){},
'fail':function(res){},
'complete':function(res){}
})
注意:appId都是不一样的,在App的在开发平台(https://open.weixin.qq.com),小程序,公众号的在公众平台(https://mp.weixin.qq.com)
App的官方demo很类似,,小程序的在我(https://www.jianshu.com/p/b7e841c551e0)
如有问题,请多多指教!