"老板,来个煎饼。" "好勒,这里扫微信。"
现如今的app,你没个微信支付宝支付,怎么好意思说自己公司能盈利。大街小巷都是扫码支付,支付已经深深嵌入在我们生活中。今天我们就来接入支付宝和微信吧。
先上效果图:
支付宝篇:
熟悉流程预个热:
1.当我们看到欣喜的商品,选择颜色,大小,配置级别,数量,选出这款sku,先向后台发起订单。
2.后台返回商品价格,数量,详情等,库存减少。
3.app拿到这些支付信息,向支付宝调起支付。
4.密码输入完成,支付结束后,客户端再次向服务端请求确认支付,而不应该仅靠返回码判断。
配置:
首先去[支付宝开放平台] https://docs.open.alipay.com/204/105297/
1.创建应用并获取APPID,填写应用信息
2.用正是的keystore.jks签名工具,打包出app,然后用微信或者新浪微博出的获取签名工具 [此处获得]https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN
,输入你应用的包名获取一串签名。因为微信支付宝认证平台都需要填写这个签名。
3.导入alipaySdk.jar
4.加入h5页
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name="com.alipay.sdk.app.H5AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden" />
5.传入商品id,数量,请求后台获取支付参数,支付参数示例如下:
{"data":"alipay_sdk=
&app_id=
&biz_content=
&charset=UTF8
&format=JSON
&method=alipay.trade.app.pay
¬ify_url=
&sign_type=
&version=1.0
&sign=""}
这个需要解析清楚,因为android或者后台都有可能把这些参数弄错或者遗漏。因为曾经有一家公司接微信支付最后没有加signtype,让我找了大半天才找到原因。
6.PayTask调起支付
private void requestForAli(final String payInfo){
Runnable payRunnable = new Runnable() {
@Override
public void run() {
// 构造PayTask 对象
PayTask alipay = new PayTask((Activity) context);
// 调用支付接口,获取支付结果
Map<String, String> result = alipay.payV2(payInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
}
7.处理支付完成的回调
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
@SuppressWarnings("unchecked")
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
//对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
Toast.makeText(context, "支付成功", Toast.LENGTH_SHORT).show();
} else if (TextUtils.equals(resultStatus, "6002")) {
Toast.makeText(context,"网络有问题",Toast.LENGTH_SHORT).show();
} else if (TextUtils.equals(resultStatus, "6001")) {
Toast.makeText(context,"您已经取消支付",Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context,"支付失败",Toast.LENGTH_SHORT).show();
}
break;
}
default:
break;
}
}
};
微信篇:
支付流程:同支付宝
配置:
去[微信开放平台]https://open.weixin.qq.com/cgi-bin/frame?t=home/app_tmpl&lang=zh_CN(https://docs.open.alipay.com/204/105297/)
1.创建应用并获取APPID和Appcecrete,填写应用信息
2.同样需要正式签名配置到开放平台
3.导入微信支付开发工具包 libammsdk.jar
4.加入微信支付权限
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
5.请求后台获取微信支付参数
6.发起微信支付请求
private void sendWxPayRes(JSONObject prepayObj) {
if (!iwxapi.isWXAppInstalled()) {
Toast.makeText(getApplicationContext(),"您还未安装微信客户端",Toast.LENGTH_SHORT).show();
return;
}
PayReq req = new PayReq();
try {
req.appId = prepayObj.getString("appid");
req.partnerId = prepayObj.getString("partnerid"); //微信收款号
req.prepayId = prepayObj.getString("prepayid"); //预支付id
req.nonceStr = prepayObj.getString("noncestr"); //订单号,由后端生成
req.timeStamp = prepayObj.getString("timestamp"); //时间戳
req.packageValue = prepayObj.getString("package");
req.sign = prepayObj.getString("sign"); //将以上参数拼接处理而来
} catch (JSONException e) {
e.printStackTrace();
}
iwxapi.sendReq(req);
}
prepayObj为第5步获取的预支付参数
7.获取支付结束回调
在应用程序包路径下一层创建wxapi的包,再创建WXPayEntryActivity类,如下:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
private String appId = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, appId);
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) {
switch (resp.errCode){
case -1:
Toast.makeText(getApplicationContext(),"支付失败", Toast.LENGTH_SHORT).show();
case 0:
Toast.makeText(getApplicationContext(),"支付成功", Toast.LENGTH_SHORT).show();
break;
case -2:
Toast.makeText(getApplicationContext(),"支付取消", Toast.LENGTH_SHORT).show();
break;
}
}
}
0表示支付成功,此时再次向后台请求确认支付成功。
测试不通过需要确认的:
1.确认你的经理在开发平台通过了支付权限。
2.确认正式签名填写在了平台配置里。
3.确认apk是用正式签名打包出来的。
也许你正在接入,但是遇到问题千万不要着急,接入支付踩到坑里很正常,大家都是怎么过来的,多检查检查细节突然就调起支付页面了,你一定会高兴地叫起来。