項目中部分功能點須要用到支付功能,移動端主要集成支付寶支付和微信支付php
支付寶sdk以及demo下載地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.JuZcSc&treeId=54&articleId=104509&docType=1java
微信sdk以及demo下載地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1android
支付寶支付最簡單,並且文檔,demo都有利於開發者閱讀算法
微信支付集成和demo是最爛的api
微信支付和支付寶支付封裝基類,封裝支付寶相關回調,和支付調用操做,以及微信調用操做:服務器
import android.annotation.TargetApi; import android.app.Dialog; import android.content.res.Resources; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; import com.alipay.sdk.app.PayTask; import com.utils.logger.util.Logger; import com.pay.library.alipay.PayResult; import com.tencent.mm.sdk.modelpay.PayReq; import com.tencent.mm.sdk.openapi.IWXAPI; import com.tencent.mm.sdk.openapi.WXAPIFactory; @TargetApi(Build.VERSION_CODES.HONEYCOMB) public abstract class BasePayActivity extends BaseFragmentActivity implements OnClickListener { private final static int DIALOG_PROGRESS = 1; protected String TAG = "soyoungboy"; protected Resources res; // private ProgressDialog progressDialog; private Dialog progressDialog; private static final int SDK_PAY_FLAG = 1; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case SDK_PAY_FLAG: { PayResult payResult = new PayResult((String) msg.obj); /** * 同步返回的結果必須放置到服務端進行驗證(驗證的規則請看https://doc.open.alipay.com/doc2/ * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665& * docType=1) 建議商戶依賴異步通知 */ String resultInfo = payResult.getResult();// 同步返回須要驗證的信息 String resultStatus = payResult.getResultStatus(); // 判斷resultStatus 爲「9000」則表明支付成功,具體狀態碼錶明含義可參考接口文檔 if (TextUtils.equals(resultStatus, "9000")) { alipaySuccess(payResult); } else { // 判斷resultStatus 爲非"9000"則表明可能支付失敗 // "8000"表明支付結果由於支付渠道緣由或者系統緣由還在等待支付結果確認,最終交易是否成功以服務端異步通知爲準(小几率狀態) if (TextUtils.equals(resultStatus, "8000")) { alipayConfirm(payResult); } else { Logger.i(payResult.toString()); // 其餘值就能夠判斷爲支付失敗,包括用戶主動取消支付,或者系統返回的錯誤 alipayFail(payResult); } } break; } //case SDK_CHECK_FLAG: { // Toast.makeText(PayDemoActivity.this, "檢查結果爲:" + msg.obj, Toast.LENGTH_SHORT).show(); // break; //} default: break; } } }; @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); } /** * @Description: 初始化頂部TitleView * @return:void */ protected abstract void initTitleView(); /** * @Description: 初始化UI(setContentView放在initView) * @return:void */ protected abstract void initView(); /** * @Description: 點擊事件 * @return:void */ protected abstract void click(View view); /** * 支付寶支付 * * @param payInfo 服務器端返回的訂單信息 */ protected void alipay(final String payInfo) { Runnable payRunnable = new Runnable() { @Override public void run() { // 構造PayTask 對象 PayTask alipay = new PayTask(BasePayActivity.this); // 調用支付接口,獲取支付結果 String result = alipay.pay(payInfo, true); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; // 必須異步調用 Thread payThread = new Thread(payRunnable); payThread.start(); } /** * 支付結果確認中 * @param payResult */ protected abstract void alipayConfirm(PayResult payResult); /** * 支付結果失敗 * @param payResult */ protected abstract void alipayFail(PayResult payResult); /** * 支付結果成功 * @param payResult */ protected abstract void alipaySuccess(PayResult payResult); /** * 微信支付 * https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_12&index=2 * * @param appid 微信分配的公衆帳號ID * @param partnerid 微信支付分配的商戶號 * @param prepayid 微信返回的支付交易會話ID * @param noncestr 隨機字符串,不長於32位。推薦隨機數生成算法 https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=4_3 * @param timestamp 時間戳,請見接口規則-參數規定 https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=4_2 * @param packageX 暫填寫固定值Sign=WXPay * @param sign 簽名,詳見簽名生成算法 * @param extData 額外的標記,未知 */ protected void wechatPay(String appid, String partnerid, String prepayid, String noncestr, String timestamp, String packageX, String sign, String extData) { IWXAPI api = WXAPIFactory.createWXAPI(BasePayActivity.this, appid); PayReq req = new PayReq(); req.appId = appid; req.partnerId = partnerid; req.prepayId = prepayid; req.nonceStr = noncestr; req.timeStamp = timestamp; req.packageValue = packageX; req.sign = sign; req.extData = extData; // 在支付以前,若是應用沒有註冊到微信,應該先調用IWXMsg.registerApp將應用註冊到微信 api.sendReq(req); } }
支付寶支付調用:微信
繼承自上面這個類,代碼裏面以下調用:app
pay_data爲服務器端幫你處理後的訂單信息。異步
String pay_data = data.getPay_data();
alipay(pay_data);
實現上面的抽象方法,便可處理支付寶成功,失敗,確認中的操做來進行支付後的下一步操做。ide
微信支付調用:
weChatPayResult = Json.get() .toObject(response, WeChatPayResult.class); WeChatPayResult.DataEntity data = weChatPayResult.getData(); WeChatPayResult.DataEntity.PayDataEntity pay_data = data.getPay_data(); boolean success = data.isSuccess(); if (success) { String appid = pay_data.getAppid(); String partnerid = pay_data.getPartnerid(); String prepayid = pay_data.getPrepayid(); String noncestr = pay_data.getNoncestr(); String timestamp = pay_data.getTimestamp(); String packageX = pay_data.getPackageX(); String sign = pay_data.getSign(); String extData = "app data"; wechatPay(appid, partnerid, prepayid, noncestr, timestamp, packageX, sign, extData); }
微信支付存在一個回調類WXPayEntryActivity.java,這個文件位置爲(你的應用包名稱+.wxapi)詳情能夠參考官方demo,也能夠直接拿過來本身用,可是要修改成你的appid:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity"; private IWXAPI api; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pay_result); 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) { int errCode = resp.errCode; Logger.i("onPayFinish, errCode = " + errCode); if (errCode == 0) { //0 成功 展現成功頁面 ToastUtil.toasts(getApplicationContext(), "支付成功"); Intent intent = new Intent(Constant.ACTION_NAME); sendBroadcast(intent); finish(); } else if (errCode == -1) { //-1 錯誤 可能的緣由:簽名錯誤、未註冊APPID、項目設置APPID不正確、註冊的APPID與設置的不匹配、其餘異常等。 ToastUtil.toasts(getApplicationContext(), "支付失敗"); finish(); } else if (errCode == -2) { //-2 用戶取消 無需處理。發生場景:用戶不支付了,點擊取消,返回APP。 ToastUtil.toasts(getApplicationContext(), "取消支付"); finish(); } } }
注意到上面的廣播,是爲了傳給你支付的頁面去進行下一步操做,記得註冊和解除廣播,而後在廣播接受者裏面進行微信支付成功下一步操做:
private BroadcastReceiver mBroadcastReceiver = new BaseBroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Logger.i("action", action); if (action.equals(Constant.ACTION_NAME)) { if (WECHATPAY.equals(payMethod)) { wechatPaySuccess(); } } } };
還有就是爲了你的微信支付不至於跳轉到回調的頁面而進入成功後的下一個頁面,能夠將回調頁面設置爲透明的,以下是AndroidManifest.xml中的配置:
<!--微信支付回調界面--> <activity android:name=".wxapi.WXPayEntryActivity" android:theme="@android:style/Theme.Translucent" android:exported="true" android:launchMode="singleTop"/>